package br.com.vilababy.sigvb.validadores;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import br.com.vilababy.sigvb.SIGVBUtil;
import br.com.vilababy.sigvb.constantes.SIGVBEnum;
import br.com.vilababy.sigvb.mb.aluno.ResponsavelMBean;
import br.com.vilababy.sigvb.modelo.Responsavel;

@FacesValidator("responsavelValidator")
public class ResponsavelValidator implements Validator{

	/**
     * @author Diego Patrick da Silva Santos 
     */
	@Override
	public void validate(FacesContext contexto, UIComponent componente, Object objeto)
			throws ValidatorException {
		FacesMessage mensagem = null;
		mensagem = validarCamposObrigatoriosVazios(objeto, componente);
			
		SIGVBUtil.tratarErroValidacao(mensagem);
	}
	
	private FacesMessage validarCamposObrigatoriosVazios(Object objeto, UIComponent componente) {
 		FacesMessage mensagem = null;
		
		if (objeto == null || (objeto != null && (objeto instanceof String ? ((String)objeto).isEmpty() : false)))
			switch (SIGVBEnum.getSIGVBEnum(componente.getId())) {
				case ID_NOME_RESPONSAVEL: mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.NOME_RESPONSAVEL_INFORME.getValor()));
				break;
				case ID_ALUNO_RESPONSAVEL: mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.SELECIONE_ALUNO.getValor()));
				break;
				case ID_RESPONSAVEL_RELACAO: mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.SELECIONE_RELACAO.getValor()));
				break;
				case ID_RESPONSAVEL_CPF: mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.CPF_INFORME.getValor()));
				break;
				case ID_RESPONSAVEL_EMAIL: mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.EMAIL_INFORME.getValor()));
				break;
				case ID_RESPONSAVEL_FINANCEIRO: mensagem = verificarExitenciaResponsavelFinanceiro(componente);
				break;
				case ID_TEL_RESIDENCIAL: mensagem = verificarTelefonePreenchido(componente);
				break;
				default: mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.CAMPO_OBRIGATORIO.getValor()));
				break;
			}
		
		return mensagem;
	}
	
	private FacesMessage verificarTelefonePreenchido(UIComponent componente) {
		FacesMessage mensagem = null;
		
		UIInput telCelular = (UIInput) componente.getAttributes().get(SIGVBEnum.ID_TEL_CELULAR.getValor());
		UIInput telComercial = (UIInput) componente.getAttributes().get(SIGVBEnum.ID_TEL_COMERCIAL.getValor());
		
		if ((telCelular == null || (telCelular != null && ((String)telCelular.getSubmittedValue()).isEmpty())) && ((telComercial == null || (telComercial != null && ((String)telComercial.getSubmittedValue()).isEmpty()))))
			mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.TELEFONE_INFORME.getValor()));
		
		return mensagem;
	}
	
	private FacesMessage verificarExitenciaResponsavelFinanceiro(UIComponent componente) {
		FacesMessage mensagem = null;
		
		ResponsavelMBean bean = new ResponsavelMBean();
		Responsavel responsavelFinanceiro = bean.getResponsavelFinanceiro(getIdAlunoSelecionado(componente));
		
		if (responsavelFinanceiro != null)
			mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.RESPONSAVEL_FINANCEIRO_INFORME.getValor()));;
			
		return mensagem;
	}
	
	private Long getIdAlunoSelecionado(UIComponent componente) {
		UIInput nomeComponente = (UIInput) componente.getAttributes().get(SIGVBEnum.ID_ALUNO_RESPONSAVEL.getValor());
		return (Long) nomeComponente.getSubmittedValue();
	}


}
